unity 查找物体的方法(包括隐藏物体) 您所在的位置:网站首页 unity gameobjectfind找不到 unity 查找物体的方法(包括隐藏物体)

unity 查找物体的方法(包括隐藏物体)

2024-06-01 18:56| 来源: 网络整理| 查看: 265

一般而言,我们在游戏中寻找物体可以使用

GameObject.Find(),GameObject.FindGameObjectWithTag(),FindObjectOfType()等这方式,在游戏运行的过程中,这几种方法各自都能运行的良好(有效率上的区别,我没有做过测试),但是当我们在做一些编辑器扩展的时候,我们遇到的一些情况这些方法就不能处理了,比如寻找场景中的隐藏物体:

 

这个时候上述的方法就不能够使用,当然,可以通过transform.Find()去寻找一个父物体下的所有包括隐藏的物体,但是有局限性,只能寻找已显示物体的子物体,其子物体的子物体不能够查询到。

如果想要找到场景内所有的隐藏物体,我们可以使用Resources.FindObjectsOfTypeAll(),这个方法,在unity的官方API上有示例代码:

(返回场景中的所有物体)

using System.Collections.Generic; using UnityEngine; using UnityEditor; public class ExampleScript : MonoBehaviour {     List GetAllObjectsOnlyInScene()     {         List objectsInScene = new List();         foreach (GameObject go in Resources.FindObjectsOfTypeAll(typeof(GameObject)) as GameObject[])         {             if (!EditorUtility.IsPersistent(go.transform.root.gameObject) && !(go.hideFlags == HideFlags.NotEditable || go.hideFlags == HideFlags.HideAndDontSave))                 objectsInScene.Add(go);         }         return objectsInScene;     } }

官方API上说明,这种方法可以列出任何类型的已加载的Unity对象,包括游戏对象,预制体,材质,网格等等,它还会列出内部对象以及禁用对象,因此在使用的时候需要做一些处理。

 

在示例代码中,EditorUtility.IsPersistent方法用来检查是否查找对象存储在磁盘里,像是以资产形式存储的预制体,美术资源等等,会返回为true,如果是在场景中的物体,比如普通物体,和预制体的实例,则会返回为false。

hideFlags则是用来标记物体是否被隐藏、保存、是否可被修改。

 

有了官方的示范,我们便可以照葫芦画瓢做一些其他的操作,就比如官方给的方法返回的是场景中的全部物体,我们可以根据寻找物体的tag,名称,自定义寻找到的物体:

 

根据tag找到场景中的一组物体:

private static List FindObjects(string tag)     {         List gameObjects = new List();         foreach (GameObject go in Resources.FindObjectsOfTypeAll(typeof(GameObject)))         {             if (!EditorUtility.IsPersistent(go.transform.root.gameObject) && !(go.hideFlags == HideFlags.NotEditable || go.hideFlags == HideFlags.HideAndDontSave))             {                 if (go.tag == tag)                     gameObjects.Add(go);             }         }         return gameObjects; }

根据名称找到场景内的特定物体:

private static GameObject FindObject2(string name)     {         foreach(GameObject go in Resources.FindObjectsOfTypeAll(typeof(GameObject)))         {             if(!EditorUtility.IsPersistent(go.transform.root.gameObject) && !(go.hideFlags == HideFlags.NotEditable || go.hideFlags == HideFlags.HideAndDontSave))             {                 if (go.name == name)                     return go;             }         }         return null; }

注:根据此方法得出的场景中的游戏对象列表,不是按照Hierarchy中的目录顺序。

    这个方法需要引用unityEditor,因此在游戏逻辑中不能够用此方法。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有